package com.zrrd.network.chatRoom;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author WanJl
 * @version 1.0
 * @title Server
 * @description 服务器
 * @create 2023/11/4 16:59
 */
public class Server {
    //1、创建ServerSocket对象
    private ServerSocket server;
    //共享的输出流的集合，里面存所有客户端的输出流，一个客户端一个输出流。
    //其实就是一个存在服务器的客户端列表
    public List<PrintWriter> list;

    //初始化服务器
    //当创建Server对象的时候，执行构造方法，自动创建ServerSocket对象。
    public Server() throws IOException {
        server = new ServerSocket(10010);
        list=new ArrayList<>();
    }

    /**
     * 服务器端开始工作的方法
     * server.accept();是一个阻塞的方法，作用是监听服务器端口号，
     * 直到有一个客户端发起连接并创建一个Socket对象。
     * 否则后面的代码是不会执行的。会一直阻塞所在线程。
     */
    public void start() {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                2,
                10,
                2,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        try {
            //不断的监听客户端发过来的请求， 并且创建Socket对象
            while (true) {

                System.out.println("正在等待客户端连接.....");
                Socket socket = server.accept();
                System.out.println("一个客户端连接成功了....");

                /**
                 * 启动一个线程
                 */
                ClientHandler ts = new ClientHandler(socket,list);
//                Thread thread = new Thread(ts);
//                thread.start();
                pool.submit(ts);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        new Server().start();
    }

}
